/**
 * @file http接口统一管理
 */
import axios from 'axios';
axios.defaults.timeout = 10000;
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';
axios.defaults.withCredential = true;
axios.defaults.crossDomain = true;

/**
* 请求失败后的错误统一处理
* @param  status 请求失败的状态码
*/
const errorHandle = (status, other) => {
  // 处理响应数据
  // 400 : 参数格式或者字段名错误
  // 401 : token错误、过期
  // 403: 无权限
  // 500 ： 服务错误
  // 状态码判断
  switch (status) {
    case 400:
      console.log('请求无效')
      break
    case 404:
      console.log('请求的资源不存在')
      break
    case 403:
      console.log('无访问权限，请联系管理员！')
      break
    case 500:
      console.log('服务端错误，请联系管理员！')
      break
    default:
      console.log(other)
  }
}

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
axios.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    // const token = store.state.token;
    // token && (config.headers.token = token);
    return config;
  },
  error => Promise.error(error)
);

// 响应拦截器
axios.interceptors.response.use(
  // 请求成功
  res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
  // 请求失败
  error => {
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      errorHandle(response.status, response.data.message);
      return Promise.reject(response);
    } else {
      return Promise.reject(error);
    }
  }
);

/**
 * get方法，对应get请求
 * @param {string} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} config [配置]
 * @return {Object} Promise
 */
export function get(url, params = {}, config = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }, config).then(res => {
      resolve(res.data);
    }).catch(err => {
      reject(err);
    });
  });
}

/**
 * post方法，对应post请求
 * @param {string} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} config [配置]
 * @return {Object} Promise
 */
export function post(url, params, config = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, params, config).then(res => {
      resolve(res.data);
    }).catch(err => {
      reject(err);
    });
  });
}